{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "80d1fa53-64c3-4b1a-bb88-a075c9824364",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data= (442, 10)\n",
      "target= (442,)\n",
      "X= (442, 10)\n",
      "y= (442,)\n",
      "X_train= (397, 10)\n",
      "X_test= (45, 10)\n",
      "y_train= (397, 1)\n",
      "y_test= (45, 1)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_diabetes\n",
    "from sklearn.utils import shuffle\n",
    "import numpy as np\n",
    "\n",
    "# https://blog.csdn.net/liuzuoping/article/details/101285053\n",
    "\n",
    "# 准备数据\n",
    "diabetes = load_diabetes()\n",
    "data = diabetes.data\n",
    "target = diabetes.target\n",
    "print('data=', data.shape)\n",
    "print('target=', target.shape)\n",
    "X, y = shuffle(data, target, random_state=13)\n",
    "X = X.astype(np.float32)\n",
    "offset = int(X.shape[0] * 0.9)\n",
    "print('X=', X.shape)\n",
    "print('y=', y.shape)\n",
    "X_train, y_train = X[:offset], y[:offset]\n",
    "X_test, y_test = X[offset:], y[offset:]\n",
    "y_train = y_train.reshape((-1, 1))\n",
    "y_test = y_test.reshape((-1, 1))\n",
    "print('X_train=', X_train.shape)\n",
    "print('X_test=', X_test.shape)\n",
    "print('y_train=', y_train.shape)\n",
    "print('y_test=', y_test.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "286ce984-eeef-4af4-87f4-95f2642f0cc1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 9999 loss 5533.039734\n",
      "epoch 19999 loss 5217.582409\n",
      "epoch 29999 loss 4949.676466\n",
      "epoch 39999 loss 4721.504031\n",
      "epoch 49999 loss 4526.567333\n",
      "epoch 59999 loss 4359.463960\n",
      "epoch 69999 loss 4215.700505\n",
      "epoch 79999 loss 4091.538010\n",
      "epoch 89999 loss 3983.863771\n",
      "epoch 99999 loss 3890.085012\n",
      "epoch 109999 loss 3808.040678\n",
      "epoch 119999 loss 3735.928279\n",
      "epoch 129999 loss 3672.243183\n",
      "epoch 139999 loss 3615.728261\n",
      "epoch 149999 loss 3565.332105\n",
      "epoch 159999 loss 3520.174353\n",
      "epoch 169999 loss 3479.516912\n",
      "epoch 179999 loss 3442.740079\n",
      "epoch 189999 loss 3409.322711\n",
      "epoch 199999 loss 3378.825770\n",
      "loss:  3378.8257696840265\n",
      "params:  {'w': array([[  54.02295033],\n",
      "       [ -35.89125007],\n",
      "       [ 248.77025707],\n",
      "       [ 181.20976164],\n",
      "       [  34.01236697],\n",
      "       [  10.09339783],\n",
      "       [-152.91224234],\n",
      "       [ 139.59805535],\n",
      "       [ 227.32479254],\n",
      "       [ 131.02924481]]), 'b': 151.4862358088389}\n",
      "grads:  {'dw': array([[-0.01785006],\n",
      "       [ 0.32780201],\n",
      "       [-0.72257439],\n",
      "       [-0.47179947],\n",
      "       [ 0.11809658],\n",
      "       [ 0.22427751],\n",
      "       [ 0.33270068],\n",
      "       [-0.18598542],\n",
      "       [-0.59042927],\n",
      "       [-0.21828683]]), 'db': 0.0006655002622762702}\n"
     ]
    }
   ],
   "source": [
    "# 执行训练并查看训练得到的回归模型参数值\n",
    "\n",
    "def initialize_params(dims):\n",
    "    w = np.zeros((dims, 1))\n",
    "    b = 0\n",
    "    return w, b  \n",
    "\n",
    "def linear_loss(X, y, w, b):\n",
    "    num_train = X.shape[0]\n",
    "    num_feature = X.shape[1]\n",
    "    # 模型公式\n",
    "    y_hat = np.dot(X, w) + b\n",
    "    # 损失函数\n",
    "    loss = np.sum((y_hat-y)**2) / num_train\n",
    "    # 参数的偏导\n",
    "    dw = np.dot(X.T, (y_hat - y)) / num_train\n",
    "    db = np.sum((y_hat - y)) / num_train        \n",
    "    return y_hat, loss, dw, db    \n",
    "    \n",
    "def linear_train(X, y, learning_rate, epochs):\n",
    "    w, b = initialize_params(X.shape[1])      \n",
    "    loss_list = []\n",
    "    for i in range(0, epochs):\n",
    "        # 计算当前预测值、损失和偏导\n",
    "        y_hat, loss, dw, db = linear_loss(X, y, w, b)\n",
    "        loss_list.append(loss)\n",
    "        w += -learning_rate * dw\n",
    "        b += -learning_rate * db            \n",
    "        if (i + 1)  % 10000 == 0:\n",
    "            print('epoch %d loss %f' % (i, loss))\n",
    "        # 保存参数\n",
    "        params = {                \n",
    "            'w': w,                \n",
    "            'b': b\n",
    "        }\n",
    "        # 保存梯度\n",
    "        grads = {                \n",
    "            'dw': dw,                \n",
    "            'db': db\n",
    "        }        \n",
    "    return loss_list, loss, params, grads  \n",
    "\n",
    "loss_list, loss, params, grads = linear_train(X_train, y_train, 0.001, 200000)\n",
    "# print('loss_list: ', loss_list)\n",
    "print('loss: ', loss)\n",
    "print('params: ', params)\n",
    "print('grads: ', grads)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "98432658-4e34-4d1c-ac04-300beb435db0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[123.79577608],\n",
       "       [140.73899483],\n",
       "       [147.09546392],\n",
       "       [117.59472175],\n",
       "       [144.05289931]])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def predict(X, params):\n",
    "    w = params['w']\n",
    "    b = params['b']\n",
    "    \n",
    "    y_perd = np.dot(X, w) + b\n",
    "    return y_perd\n",
    "\n",
    "y_pred = predict(X_test, params)\n",
    "y_pred[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "752f68bd-6601-4bb9-bd7f-a5b5f33ffae7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 利用matplotlib对预测结果和真值进行展示\n",
    "import matplotlib.pyplot as plt\n",
    "f = X_test.dot(params['w']) + params['b']\n",
    "plt.scatter(range(X_test.shape[0]), y_test)\n",
    "plt.plot(f, color = 'darkorange')\n",
    "plt.xlabel('X')\n",
    "plt.ylabel('y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "5d95583a-12c0-4848-b27f-4ae8d1503468",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练过程中损失的下降\n",
    "plt.plot(loss_list, color = 'blue')\n",
    "plt.xlabel('epochs')\n",
    "plt.ylabel('loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91fde14b-31de-4323-bbb0-ebb917330095",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "56846712-99d5-47f3-88dc-bf3130f6bd0e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
